home *** CD-ROM | disk | FTP | other *** search
AMOS Source Code | 1993-02-25 | 9.0 KB | 369 lines |
- ' SoundTracker/NoiseTracker/OtherTracker Module converter V 2.0
- ' By Fran�ois Lionet
- ' October 13th, 1990
- '
- ' This program converts any module from any Soundtracker (all versions)
- ' and NoiseTracker (tested up to 1.1) to AMOS music bank format.
- '
- ' AMOS 1.2 Music player supports all NoiseTracker 1.1 Labels.
- '
- ' IMPORTANT NOTE: due to the new labels, music banks created by this
- ' program will crash the old music player (V1.1). You are therefore
- ' encouraged to spread the new music player to all AMOS users!
- '
- ' We would like to thank the many users who contacted us when the first
- ' converter was released. With their test data and help we were able to
- ' update this program quickly.
- '
- 'Opens a very small screen to save memory
- Screen Open 0,640,48,2,Hires : Colour 1,$FFF
- Curs Off
- '
- Dim IREAL(32)
- Global TST,AMAX,ABASE
- '
- IMAX=14 : Dim APAT(5)
- SONGDATA=4
- I$="Not named "
- I_END=$8000
- I_SVOL=$8300
- I_STOP=$8400
- I_REP=$8500
- I_LEDM=$8600
- I_LEDA=$8700
- I_TEMPO=$8800
- I_INST=$8900
- I_ARP=$8A00
- I_PORT=$8B00
- I_VIB=$8C00
- I_VSL=$8D00
- I_SLUP=$8E00
- I_SLDOWN=$8F00
- I_DEL=$9000
- I_PJMP=$9100
- '
- AGAIN:
- ST$=Fsel$("**","","Sound-NoiseTracker converter V2.1","Please enter module to convert")
- If ST$="" Then Default : Edit
- Open In 1,ST$ : BMAX=Lof(1) : Close
- Erase 10 : Reserve As Work 10,BMAX
- Bload ST$,Start(10)
- '---> What version of Soundtracker?
- CODE$="M.K."
- If Leek(Start(10)+$438)=Leek(Varptr(CODE$))
- OF_MUSIC=$43C
- OF_PATTERN=$3B8
- OF_NUMBER=$3B6
- MXINST=30
- Else
- OF_MUSIC=600
- OF_PATTERN=472
- OF_NUMBER=470
- MXINST=15
- End If
- '---> Gets size of instruments and song
- TST=-1 : Gosub I_CONV
- TST=-1 : Gosub S_CONV
- Print "Number of instruments:";NI
- '---> Converts patterns
- LWORK=(((BMAX-LINST-LSONG)*3)/3+1) and $FFFFFFFE
- N=0
- Repeat
- If N=0
- Print "Converting song..."
- Else
- Print : Print "One more try: my buffer estimation was too small!"
- End If
- Gosub P_CONV : Print
- LWORK=LWORK+4000
- Inc N
- Until LPATTERN
- '---> Converts song
- Print "Converting song..."
- TST=0 : Gosub S_CONV
- '---> Converts instruments
- Print "Converting instruments..."
- TST=0 : Gosub I_CONV
- ' Creates header
- AD=Start(10) : A$="AmBk" : Gosub 10100 : Doke AD,3 : Doke AD+2,0 : AD=AD+4
- TL=8+16+LINST+LSONG+LPATTERN : Loke AD,$80000000 or TL : AD=AD+4
- A$="Music " : Gosub 10100
- Loke AD,16 : Loke AD+4,16+LINST : Loke AD+8,16+LINST+LSONG : Loke AD+12,0 : AD=AD+16
- ' Copy instrument
- SAMCOPY[SCOPY,ECOPY,AD+NI*32+2+4]
- Copy Start(11),Start(11)+NI*32+2 To AD
- Loke AD+2+NI*32,0
- ' Copy Song
- Copy Start(12),Start(12)+LSONG To AD+LINST
- ' Copy Patterns
- Copy Start(13),Start(13)+LPATTERN To AD+LINST+LSONG
- '
- Clw : ABK$=Fsel$("*.abk","","Save as Amos Music Bank .abk") : If ABK$="" Then Goto AGAIN
- Print : Print "Saving AMOS music bank..."
- Bsave ABK$,Start(10) To AD+LINST+LSONG+LPATTERN
- ' Play the music!
- Clw : Centre "Loading the new bank to play it!"
- For N=10 To 13
- Erase N
- Next
- Load ABK$ : Volume 63 : Music 1
- Clw : Centre "Press a key to end..."
- Wait Key
- For V=63 To 0 Step -1
- Volume V
- Wait Vbl
- Next
- Erase 3
- Clw
- ' And now, happy structured people, a nice GOTO! Arghhh, kill him!
- Goto AGAIN
- '----------------------------------------------------------------------------
- ' Instrument conversion
- '----------------------------------------------------------------------------
- I_CONV:
- AD=Start(10)
- NPAT=0
- For A=AD+OF_PATTERN To AD+OF_PATTERN+127
- NPAT=Max(NPAT,Peek(A))
- Next A
- Inc NPAT : LMAX=NPAT*1024
- ADI=AD+LMAX+OF_MUSIC
- NI=0
- For A=AD+20 To AD+20+$1E*MXINST Step $1E
- If Deek(A+22) Then Inc NI
- Next
- Erase 11 : Reserve As Work 11,NI*32+2+4 : APOK=Start(11)
- AOFF=APOK : SDOKE[AOFF,NI] : AOFF=AOFF+2 : AINST=AOFF+NI*32
- INUL=AINST : SLOKE[AINST,0] : AINST=AINST+4 : SCOPY=ADI
- I=0 : IR=0
- For A=AD+20 To AD+20+$1E*MXINST Step $1E
- If Deek(A+22)
- IREAL(I)=IR : Inc IR
- SLOKE[AOFF,AINST-APOK] : L=Deek(A+22) : SDOKE[AOFF+14,L]
- I2=Deek(A+26) : L2=Deek(A+28)
- If L2<=2
- SDOKE[AOFF+8,L]
- SLOKE[AOFF+4,INUL-APOK] : SDOKE[AOFF+10,2]
- Else
- SDOKE[AOFF+8,Max(I2/2,1)]
- SLOKE[AOFF+4,AINST-APOK+I2] : SDOKE[AOFF+10,L2]
- End If
- SDOKE[AOFF+12,Deek(A+24)]
- L=L*2 : ECOPY=ADI+L
- ADI=ADI+L : AINST=AINST+L
- For P=0 To 15 : SPOKE[AOFF+16+P,Peek(A+P)] : Next
- Add AOFF,32
- End If
- Inc I
- Next
- If Btst(0,AINST) Then Inc AINST
- LINST=AINST-APOK
- Return
- '----------------------------------------------------------------------------
- ' Song conversion
- '----------------------------------------------------------------------------
- S_CONV:
- APOK=0
- If TST=0
- Erase 12 : Reserve As Work 12,LSONG : APOK=Start(12)
- T=17
- End If
- AD=Start(10) : AMU=APOK
- SDOKE[AMU,1] : Add AMU,2
- SLOKE[AMU,6] : Add AMU,4
- If T<=0 or T>100 Then T=17
- SDOKE[AMU+8,T]
- LLIST=Peek(AD+OF_NUMBER)
- LPAT=(LLIST+1)*2 : APAT=8+SONGDATA+16
- For N=0 To 3 : APAT(N)=AMU+APAT : SDOKE[AMU+N*2,APAT] : APAT=APAT+LPAT : Next N
- AMU=AMU+8+SONGDATA
- For A=0 To 15 : SPOKE[AMU+A,Peek(AD+A)] : Next : Add AMU,16
- AMU=AMU+LPAT*4
- For A=AD+OF_PATTERN To AD+OF_PATTERN+LLIST-1
- P=Peek(A)
- For V=0 To 3
- SDOKE[APAT(V),P] : APAT(V)=APAT(V)+2
- Next V
- Next A
- For V=0 To 3
- SDOKE[APAT(V),-2]
- Next V
- If Btst(0,AMU) Then Inc AMU
- LSONG=AMU-APOK
- Return
- '----------------------------------------------------------------------------
- ' Pattern conversion
- '----------------------------------------------------------------------------
- P_CONV:
- Erase 13 : Reserve As Work 13,LWORK : AMAX=Start(13)+LWORK-512 : Fill Start(13) To Start(13)+Length(13),0
- AD=Start(10) : AOFF=Start(13)
- Print "Number of different patterns:";NPAT
- APAT=AOFF+2+NPAT*8
- Doke AOFF,NPAT
- For NP=0 To NPAT-1 : PATMAX=64 : NBESS=0 : AAPAT=APAT : PJMP=0
- O_AGAIN:
- For V=0 To 3 : Locate 0,Y Curs : Print "Computing pattern";NP;" - voice";V;
- AP=AD+OF_MUSIC+NP*1024
- Doke AOFF+2+NP*8+V*2,APAT-AOFF
- Gosub PP_CONV : If APAT>AMAX Then LPATTERN=0 : Return
- Next V
- If PATMAX<>64 and NBESS=0 Then NBESS=1 : APAT=AAPAT : Goto O_AGAIN
- Next NP
- LPATTERN=APAT-Start(13)
- Return
- '
- PP_CONV:
- OI=-1 : VIT=1 : NN=0 : DEL=0 : OLDEFF=-1 : OPRAM=-1 : VOL=-1
- PP_LOOP:
- Do
- Inc NN : Exit If NN>PATMAX
- D1=Deek(AP+V*4) : D2=Deek(AP+V*4+2) : AP=AP+16
- I=(D2/$1000)+((D1 and $1000)/$1000)*16-1
- If I>=0
- If OI<>I or VOL<>63
- Gosub POK_DELAY
- Doke APAT,I_SVOL+63 : Add APAT,2 : VOL=63
- Doke APAT,I_INST+IREAL(I) : Add APAT,2
- OI=I
- End If
- End If
- EFF=(D2 and $F00)/$100 : PRAM=D2 and $FF
- If EFF<>OLDEFF or PRAM<>OPRAM
- On OLDEFF+1 Gosub EST,EST,EST,EST,EST,NST,NST,NST,NST,NST,EST,NST,NST,NST,NST,NST
- On EFF+1 Gosub EF0,EF1,EF2,EF3,EF4,EF5,EF6,EF7,EF8,EF9,EF10,EF11,EF12,EF13,EF14,EF15
- OLDEFF=EFF : OPRAM=PRAM
- End If
- If D1 and $FFF
- Gosub POK_DELAY
- Doke APAT,$3000+(D1 and $FFF) : Add APAT,2
- End If
- Add DEL,VIT
- Loop
- '
- PP_END:
- Gosub POK_DELAY
- If PATMAX<>64 and PJMP<>0
- Doke APAT,PJMP : Add APAT,2
- Else
- Doke APAT,I_END : Add APAT,2
- End If
- Return
- '
- POK_DELAY:
- If DEL
- Doke APAT,I_DEL+DEL : Add APAT,2
- DEL=0
- End If
- Return
- '
- ' Stop old effect
- EST:
- On EFF+1 Goto STA,NST,NST,NST,NST,SST,SST,SST,SST,SST,NST,SST,SST,SST,SST,SST
- STA: If PRAM=0 Then Goto SST
- NST: Return
- SST: Gosub POK_DELAY : Doke APAT,I_STOP : Add APAT,2 : Return
- '
- ' 0-> Arpeggio
- EF0:
- If PRAM
- Gosub POK_DELAY
- Doke APAT,I_ARP+PRAM : Add APAT,2
- End If
- Return
- ' 1-> Slide up
- EF1:
- Gosub POK_DELAY
- Doke APAT,I_SLUP+PRAM : Add APAT,2 : Return
- ' 2-> Slide down
- EF2:
- Gosub POK_DELAY
- Doke APAT,I_SLDOWN+PRAM : Add APAT,2 : Return
- ' 3-> Portamento
- EF3:
- Gosub POK_DELAY
- Doke APAT,I_PORT+PRAM : Add APAT,2 : Return
- ' 4-> Vibrato
- EF4:
- Gosub POK_DELAY
- Doke APAT,I_VIB+PRAM : Add APAT,2 : Return
- ' 5-> Future expansion
- EF5: Return
- ' 6-> Future expansion
- EF6: Return
- ' 7-> Future expansion
- EF7: Return
- ' 8-> Future expansion
- EF8: Return
- ' 9-> Future expansion
- EF9: Return
- ' A Volume slide
- EF10:
- Gosub POK_DELAY
- Doke APAT,I_VSL+PRAM : Add APAT,2 : VOL=-1 : Return
- ' B Position jump
- EF11:
- Gosub POK_DELAY
- PJMP=I_PJMP+PRAM : PATMAX=NN-1 : Return
- ' C Set volume
- EF12:
- Gosub POK_DELAY
- If VOL<>PRAM and OI>=0
- Doke APAT,I_SVOL+PRAM : VOL=PRAM : Add APAT,2
- End If
- Return
- ' D Pattern break
- EF13:
- Gosub POK_DELAY
- PATMAX=NN-1 : Return
- ' E Led on / off
- EF14:
- Gosub POK_DELAY
- If Btst(1,PRAM) Then Doke APAT,I_LEDM Else Doke APAT,I_LEDA
- Add APAT,2 : Return
- ' F Set tempo
- EF15:
- Gosub POK_DELAY
- Doke APAT,I_TEMPO+(100/PRAM) : Add APAT,2 : Return
- '
- '
- '
- '
- 10000 For X=0 To Len(A$)-1
- 10005 SPOKE[A+X,Asc(Mid$(A$,X+1,1))]
- 10010 Next
- 10015 Return
- 10100 A=AD : Gosub 10000 : AD=AD+Len(A$) : Return
- '
- Procedure SPOKE[A,B]
- If TST=0
- Poke A,B
- End If
- End Proc
- '
- Procedure SDOKE[A,B]
- If TST=0
- Doke A,B
- End If
- End Proc
- '
- Procedure SLOKE[A,B]
- If TST=0
- Loke A,B
- End If
- End Proc
- '
- Procedure SAMCOPY[S,E,D]
- If TST=0
- If S mod 2=0 and E mod 2=0 and D mod 2=0
- Copy S,E To D
- Else
- Print "Slow Copying Sample"
- A=0
- While A+S<E
- Poke D+A,Peek(S+A)
- Inc A
- Wend
- Print "Done."
- End If
- End If
- End Proc